package com.example.service

import com.example.data.dbQuery
import com.example.data.entity.UserEntity
import com.example.data.entity.UserEntity.id
import com.example.data.entity.UserEntity.password
import com.example.data.entity.UserEntity.status
import com.example.data.entity.UserEntity.username
import com.example.data.model.LoginDTO
import com.example.data.model.Response
import com.example.data.model.UserDTO
import com.example.data.model.UserForAdmin
import io.ktor.server.application.*
import io.ktor.server.response.*
import org.jetbrains.exposed.sql.*
import org.jetbrains.exposed.sql.SqlExpressionBuilder.eq

class UserService {
    ///////////////////////////////////////////////////////////////////////////
    // 管理员
    ///////////////////////////////////////////////////////////////////////////
    suspend fun allUser(page: Int, pageSize: Int, u: String?) = dbQuery {
        UserEntity.selectAll()
            .where { (UserEntity.type eq "用户") and (if (u != null) username like "%${u}%" else Op.TRUE) }
            .limit(pageSize, (pageSize * (page - 1)).toLong())
            .map {
                UserForAdmin(it[id], it[username], it[password], it[status])
            }
    }

    suspend fun getUser(id: Int) = dbQuery {
        UserEntity.selectAll().where { UserEntity.id eq id }.map {
            UserForAdmin(it[UserEntity.id], it[username], it[password], it[status])
        }.first()
    }

    suspend fun addUser(userForAdmin: UserForAdmin) = dbQuery {
        UserEntity.insert {
            it[username] = userForAdmin.username
            it[password] = userForAdmin.password
            it[status] = userForAdmin.status
        }.insertedCount > 0
    }

    suspend fun editUser(userForAdmin: UserForAdmin) = dbQuery {
        UserEntity.update(where = {
            UserEntity.id eq userForAdmin.id
        }) {
            it[username] = userForAdmin.username
            it[password] = userForAdmin.password
            it[status] = userForAdmin.status
        } > 0
    }

    suspend fun deleteUser(id: Int) = dbQuery {
        UserEntity.deleteWhere { UserEntity.id eq id } > 0
    }

    ///////////////////////////////////////////////////////////////////////////
    // 用户
    ///////////////////////////////////////////////////////////////////////////
    suspend fun login(loginDTO: LoginDTO): UserDTO? {
        return dbQuery {
            UserEntity.select { (username eq loginDTO.username) and (UserEntity.password eq loginDTO.password) }
                .map { UserDTO(it[UserEntity.type], it[status]) }.firstOrNull()
        }
    }


    suspend fun isExist(loginDTO: LoginDTO): UserDTO? {
        return dbQuery {
            UserEntity.select { (username eq loginDTO.username) }
                .map { UserDTO(it[UserEntity.type], it[status]) }.firstOrNull()
        }
    }


    suspend fun register(dto: LoginDTO) = dbQuery {
        UserEntity.insert {
            it[username] = dto.username
            it[password] = dto.password
        }.insertedCount > 0
    }

    suspend fun count() = dbQuery {
        UserEntity.selectAll().count()
    }
}